home *** CD-ROM | disk | FTP | other *** search
- {DAT2TXT v0.90- Free DOS utility: Converts .QWK MESSAGES.DAT to text.}
- {$V-,S-}
- program DAT2TXT ;
- uses dos ;
- const
- Seperator = '---------------------------------------------------------------------------' ;
- herald = '===========================================================================' ;
- type
- CharArray = array[1..6] of char ; { to read in chunks }
-
- MSGDATHdr = record { ALSO the format for SWAG files !!! }
- Status : char ;
- MSGNum : array [1..7] of char ;
- Date : array [1..8] of char ;
- Time : array [1..5] of char ;
- UpTO : array [1..25] of char ;
- UpFROM : array [1..25] of char ;
- Subject : array [1..25] of char ;
- PassWord : array [1..12] of char ;
- ReferNum : array [1..8] of char ;
- NumChunk : CharArray ;
- Alive : byte ;
- LeastSig : byte ;
- MostSig : byte ;
- Reserved : array [1..3] of char ;
- end ;
-
- var
- F : file ;
- txtfile : text ;
-
- procedure showhelp(problem:byte); {if any *foreseen* errors arise, we are sent}
- { here to give a little help and exit peacefully }
- const
- progdata = 'DAT2TXT v0.90- Free DOS utility: Converts .QWK MESSAGES.DAT to text.';
- progdat2 = '(By SWAG contributors.)';
- usage = 'Usage: DAT2TXT infile(s) [/o]';
- usag2 = 'The "/o" causes DAT2TXT to overwrite (not append to) existing messages.txt.';
- note = 'DOS * and ? wildcards ok with "infile(s)". Output is always to MESSAGES.TXT.';
- var
- message : string[80];
- begin
- writeln(progdata); { just tell user what this program }
- writeln(progdat2); { is and who wrote it }
- writeln;
- writeln(usage);
- writeln(usag2);
- writeln(note);
- writeln;
- writeln('Error encountered:');
- case problem of
- 1 : message := 'Incorrect number of parameters.';
- { plenty of room for other errors! }
- else
- message := 'Unknown error.';
- end;
- writeln(message);
- halt(problem);
- end;
-
- function converttoupper(w : string) : string;
- var
- cp : integer; {the position of the character to change.}
- begin
- for cp := 1 to length(w) do
- w[cp] := upcase(w[cp]);
- converttoupper := w;
- end;
-
- function ArrayTOInteger ( B : CharArray ; Len : byte ) : longint ;
-
- var I : byte ;
- S : string ;
- E : integer ;
- T : integer ;
-
- begin
- S := '' ;
- for I := 1 to Len do
- if B[i] <> #32 then S := S + B[i] ;
-
- Val ( S, T, E );
-
- if E = 0 then
- ArrayToInteger := T
- else
- ArrayToInteger := 0 ;
- end ;
-
- procedure ReadWriteHdr ( var HDR : MSGDatHdr );
- begin
- BlockRead ( F, Hdr, 1 );
- if ArrayToInteger ( Hdr.NumChunk, 6 ) <> 0 then
- with Hdr do begin
- writeln ( txtfile, herald );
- write ( txtfile, 'Date: ', Date, ' (', Time, ')' );
- writeln ( txtfile, '' : 23, 'Number: ', MSGNum );
- write ( txtfile, 'From: ', UpFROM );
- writeln ( txtfile, '' : 14, 'Refer#: ', ReferNum );
- write ( txtfile, ' To: ', UpTO );
- write ( txtfile, '' : 15, 'Recvd: ' );
- if Status in ['-', '`', '^', '#'] then
- writeln ( txtfile, 'YES' )
- else
- writeln ( txtfile, 'NO' );
- write ( txtfile, 'Subj: ', Subject );
- writeln ( txtfile, '' : 16, 'Conf: ', '(', (MostSig * 256) + LeastSig, ')' );
- writeln ( txtfile, Seperator );
- end ;
- end ;
-
- procedure ReadMSG ( NumChunks : integer );
- var
- Buff : array [1..128] of char ;
- J : integer ;
- I : byte ;
-
- begin
- for J := 1 to PRED ( NumChunks ) do begin
- BlockRead ( F, Buff, 1 );
- for I := 1 to 128 do
- if Buff [I] = #$E3 then
- writeln ( txtfile )
- else
- write ( txtfile, Buff [I] );
- end ;
- end ;
-
- procedure ReadMessage ( HDR : MSGDatHdr ; RelNum : longint ; var Chunks : integer );
- begin
- Seek ( F, RelNum - 1 );
- ReadWriteHdr ( HDR );
- Chunks := ArrayToInteger ( HDR.NumChunk, 6 );
- if Chunks <> 0 then begin
- ReadMsg ( Chunks );
- writeln ( txtfile );
- end
- else
- Chunks := 1 ;
- end ;
-
- var
- MSGHdr : MSGDatHdr ;
- repordat : boolean ;
- ch : char ;
- count : integer ;
- chunks : integer ;
- defsavefile : string ;
- fileinfo : searchrec ;
- fdt : longint ;
- ps1,ps2 : string [2] ;
- fileexists,
- overwrite : boolean ;
- response : char ;
-
- dpath, tpath : pathstr ;
- {epath & dpath are fully qualified pathnames of .dat & .txt files}
-
- ddir, tdir : dirstr ;
- dname, tname : namestr ;
- d_ext, t_ext : extstr ;
- txtfileinfo : searchrec ;
-
- begin
- if ( paramcount < 1) or ( paramcount > 2) then showhelp(1);
- ps1 := converttoupper ( paramstr (1));
- if (ps1 = '/H') or (ps1 = '/?') or
- (ps1 = '-H') or (ps1 = '-?') then showhelp(0);
-
- DefSaveFile := '' ;
- ps2 := '/A' ;
- if paramcount > 1 then ps2 := paramstr ( 2 );
- overwrite := (upcase ( ps2[2] ) = 'O');
- dpath := fexpand ( paramstr ( 1 ) );
- fsplit ( dpath, ddir, dname, d_ext );
- { break up path into components }
- findfirst ( dpath, anyfile, fileinfo );
- while doserror = 0 do begin
- fsplit ( fexpand ( fileinfo.name ), tdir, tname, t_ext );
- dpath := ddir + fileinfo.name ;
- tpath := ddir + tname + '.TXT' ;
- Assign ( F, dpath );
- { whatever file .. ( MESSAGES.DAT for .QWK ) }
- Reset ( F, SizeOf ( MsgHdr ) );
-
- assign ( txtfile, tpath );
- {$i-} reset ( txtfile ); {$i+}
- fileexists := (ioresult = 0);
-
- if fileexists then close ( txtfile );
- if fileexists and ( not overwrite ) then
- append ( txtfile )
- else
- rewrite ( txtfile );
-
- write ( 'DAT2TXT: ', dpath, ' to: ', tpath );
- Count := 2 ; { start at RECORD #2 }
- while Count < FileSize ( F ) do begin
- ReadMessage ( MSGHdr, Count, Chunks );
- INC ( Count, Chunks );
- end ;
-
- getftime ( F, fdt );
- close ( F ); close ( txtfile ); reset ( txtfile );
- setftime ( txtfile , fdt );
- close ( txtfile );
-
- writeln ( ', done!' );
- findnext ( fileinfo );
- end ;
- end.